home *** CD-ROM | disk | FTP | other *** search
/ Programming a Multiplayer FPS in DirectX / Programming a Multiplayer FPS in DirectX (Companion CD).iso / DirectX / dxsdk_oct2004.exe / dxsdk.exe / Utilities / Content Creation Tool Plug-Ins / Maya / Sources / MayaInterface.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2004-09-27  |  26.7 KB  |  1,013 lines

  1. //-----------------------------------------------------------------------------
  2. // INCLUDE FILES
  3. //-----------------------------------------------------------------------------
  4. #include "dxstdafx.h"
  5.  
  6. #include "d3d9.h"
  7. #include "d3dx9.h"
  8.  
  9. #include "MayaInterface.h"
  10.  
  11. #include <windows.h>
  12. #include <windowsx.h>
  13. #include <commdlg.h>
  14. #include <assert.h>
  15. #include <stdio.h>
  16. #include <memory.h>
  17. #include <string.h>
  18. #include <wchar.h>
  19. #include <stdlib.h>
  20. #include <math.h>
  21. #include <malloc.h>
  22. #include <tchar.h>
  23.  
  24. // Maya API
  25. #include <maya/MPxNode.h>
  26. #include <maya/MPxHwShaderNode.h>
  27. #include <maya/MString.h>
  28. #include <maya/MTypeId.h>
  29. #include <maya/MPlug.h>
  30. #include <maya/MDataBlock.h>
  31. #include <maya/MDataHandle.h>
  32. #include <maya/MArrayDataHandle.h>
  33. #include <maya/MFnNumericAttribute.h>
  34. #include <maya/MFnLightDataAttribute.h>
  35. #include <maya/MFnMessageAttribute.h>
  36. #include <maya/MFnCompoundAttribute.h>
  37. #include <maya/MFnTypedAttribute.h>
  38. #include <maya/MFloatVector.h>
  39. #include <maya/MFnPlugin.h>
  40. #include <maya/MFnStringData.h>
  41. #include <maya/MFnDoubleArrayData.h>
  42. #include <maya/MSceneMessage.h>
  43. #include <maya/MNodeMessage.h>
  44. #include <maya/MDagMessage.h>
  45. #include <maya/MDGMessage.h>
  46. #include <maya/MUiMessage.h>
  47. #include <maya/MEventMessage.h>
  48. #include <maya/MModelMessage.h>
  49. #include <maya/MSelectionList.h>
  50. #include <maya/MItDag.h>
  51. #include <maya/MDagPathArray.h>
  52. #include <maya/MIntArray.h>
  53. #include <maya/MItDependencyNodes.h>
  54. #include <maya/MFnCamera.h>
  55. #include <maya/MTime.h>
  56. #include <maya/MMatrix.h>
  57. #include <maya/MItSelectionList.h>
  58. #include <maya/MItDependencyGraph.h>
  59.  
  60.  
  61. #define DXCC_EXPORTER "X-File"
  62. #define DXCC_SHADER "DirectXShader"
  63. #define DXCC_PREVIEW_TOGGLE "DXCCPreviewToggle"
  64. #define DXCC_GATHER_ANIMATION "DXCCGatherAnimation"
  65. #define DXCC_REBUILD_SCENE "DXCCRebuildScene"
  66. #define DXCC_REBUILD_SELECTED "DXCCRebuildSelected"
  67. #define DXCC_EXPORT_SCENE "DXCCExportScene"
  68. #define DXCC_EXPORT_SELECTED "DXCCExportSelected"
  69. #define DXCC_VIEW_FLOATING "DXCCFloatingView"
  70. #define DXCC_VIEW_TOP "DXCCTopView"
  71. #define DXCC_VIEW_SIDE "DXCCSideView"
  72. #define DXCC_VIEW_FRONT "DXCCFrontView"
  73. #define DXCC_VIEW_PERSP "DXCCPerspectiveView"
  74.  
  75. MTypeId  DirectXShader::id( 0x68038 );
  76. MObject  DirectXShader::aDXCCCommand;
  77. MObject  DirectXShader::aDXCCHandle;
  78. MObject  DirectXShader::aColor;
  79. MObject  DirectXShader::aColorR;
  80. MObject  DirectXShader::aColorG;
  81. MObject  DirectXShader::aColorB;
  82. MObject  DirectXShader::aOutColor;
  83. MObject  DirectXShader::aOutColorR;
  84. MObject  DirectXShader::aOutColorG;
  85. MObject  DirectXShader::aOutColorB;
  86. MObject  DirectXShader::aNormalCamera;
  87. MObject  DirectXShader::aNormalCameraX;
  88. MObject  DirectXShader::aNormalCameraY;
  89. MObject  DirectXShader::aNormalCameraZ;
  90.  
  91. MStatus DCCUnifiedViewerCommand ( const MArgList& Arg, const char* strView);
  92. HANDLE    DirectXShader::FxDialogEvent= NULL;
  93.  
  94. //-----------------------------------------------------------------------------
  95. // MAYA PLUGIN FUNCTIONS
  96. //-----------------------------------------------------------------------------
  97.  
  98. MString MakeNameExportable(MString &in)
  99. {
  100.     const char *inConv= in.asChar();
  101.     char outConv[MAX_PATH+1];
  102.     for(UINT i= 0; i < in.length() && i < MAX_PATH; i++)
  103.     {
  104.         if(isalnum( inConv[i] )//alphanumeric//A û Z, a û z, or 0 û 9
  105.         || (inConv[i] == '_'))
  106.             outConv[i]= inConv[i];
  107.         else
  108.             outConv[i]= '_';
  109.     }
  110.  
  111.     if(in.length() <= MAX_PATH)
  112.         outConv[in.length()]= '\0';
  113.     else
  114.         outConv[MAX_PATH]= '\0';
  115.     
  116.     return MString(outConv);
  117. }
  118.  
  119.  
  120.  
  121. void CMayaPreviewPipeline::Callback_NodeParentingChange( MDagMessage::DagMessage dagMsg, MDagPath &child, MDagPath &parent, void * clientData )
  122. {
  123.     g_PreviewPipeline.Tag_Reparent( dagMsg, child, parent, true );
  124.     return;
  125. }
  126.  
  127. void CMayaPreviewPipeline::Callback_NodeAttributeChanged( MNodeMessage::AttributeMessage msg,
  128.     MPlug & plug,
  129.     MPlug & otherPlug,
  130.     void* clientData )
  131. {
  132.     g_PreviewPipeline.Tag_Dirty(msg, plug, otherPlug);
  133.     return;
  134. }
  135.  
  136.  
  137.  
  138.  
  139. void CMayaPreviewPipeline::Callback_NodeNameChange( MObject & node, void* clientData )
  140. {
  141.     g_PreviewPipeline.Tag_Rename(node);
  142.     return;
  143. }
  144.  
  145. void CMayaPreviewPipeline::Callback_SceneIdle( void* clientData )
  146. {
  147.     g_PreviewPipeline.Scene_Update(false);
  148.     return;
  149. }
  150.  
  151. //add resourced on newed item (not loaded)
  152. void CMayaPreviewPipeline::Callback_NodeAdded( MObject & node, void* clientData )
  153. {
  154.     g_PreviewPipeline.Tag_Add(  node );
  155.     return;
  156. }
  157.  
  158.  
  159. //void CMayaPreviewPipeline::Callback_NodeRemoved( MObject & node, MDGModifier & modifier, void* clientData )
  160. void CMayaPreviewPipeline::Callback_NodeRemoved( MObject & node, void* clientData )
  161. {
  162.     g_PreviewPipeline.Tag_Remove(node);
  163.     return;
  164. }
  165.  
  166. void CMayaPreviewPipeline::Callback_SceneSave(void* clientData )
  167. {
  168.     CPipelineLock SceneLock;
  169.     g_PreviewPipeline.SceneReadLock(true, SceneLock);
  170.  
  171.     for(MItDependencyNodes iter; !iter.isDone(); iter.next())
  172.     {
  173.         MFnDependencyNode depNode(iter.item());
  174.         if(depNode.typeId() == DirectXShader::id)
  175.         {
  176.             g_PreviewPipeline.Material_Save(depNode.object());
  177.         }
  178.     }
  179.  
  180.     g_PreviewPipeline.SceneReadUnlock(SceneLock);
  181. }
  182.  
  183. void CMayaPreviewPipeline::Callback_ScenePreload(void* clientData )
  184. {
  185.     g_PreviewPipeline.UI_SetPreviewState(false);
  186.     g_PreviewPipeline.Scene_Deregister();
  187.  
  188.     g_PreviewPipeline.CallbackId_AfterOpen= MSceneMessage::addCallback( MSceneMessage::Message::kAfterOpen, CMayaPreviewPipeline::Callback_ScenePostload, NULL, NULL);
  189. }
  190.  
  191. //add resourced on scene update or reload
  192. void CMayaPreviewPipeline::Callback_ScenePostload(void* clientData )
  193. {
  194.     MMessage::removeCallback(g_PreviewPipeline.CallbackId_AfterOpen);
  195.  
  196.     g_PreviewPipeline.Scene_Register();
  197.  
  198.     CPipelineLock SceneLock;
  199.     g_PreviewPipeline.SceneWriteLock(true, SceneLock);
  200.  
  201.     for(MItDependencyNodes iter; !iter.isDone(); iter.next())
  202.     {
  203.         MFnDependencyNode depNode(iter.item());
  204.         if(depNode.typeId() == DirectXShader::id)
  205.         {
  206.             g_PreviewPipeline.Material_Restore(depNode.object());
  207.         }
  208.     }
  209.  
  210.     g_PreviewPipeline.Scene_Update(TRUE);
  211.  
  212.     g_PreviewPipeline.SceneWriteUnlock(SceneLock);
  213.  
  214.  
  215. };
  216.  
  217.  
  218.  
  219. MStatus DCCRebuildSelectedCommand::doIt ( const MArgList& Arg)
  220. {
  221.  
  222.     MStatus stat;
  223.     MSelectionList    list;
  224.     MGlobal::getActiveSelectionList(list);
  225.     
  226.     DXCC_DPF_REPORT(TEXT("REFRESH SELECTION"));
  227.     MGlobal::displayInfo("DirectX Rebuilding Selected (currently previewed items only)");
  228.  
  229.     for (UINT i=0; i < list.length(); i++)
  230.     {
  231.         MDagPath dagPath;
  232.         UINT iRemove;
  233.  
  234.         list.getDagPath(i, dagPath);
  235.  
  236.         if(g_PreviewPipeline.TagContainer.Find(dagPath, &iRemove, NULL))
  237.         {
  238.             g_PreviewPipeline.TagContainer.Erase(iRemove);
  239.         }
  240.  
  241.         g_PreviewPipeline.TagContainer.Add(dagPath, NULL, NULL);
  242.  
  243.     }
  244.     g_PreviewPipeline.Scene_Update(true);
  245.  
  246.  
  247.     return stat;
  248. }
  249.  
  250. MStatus DXCCRebuildSceneCommand::doIt ( const MArgList& Arg)
  251. {
  252.  
  253.     MStatus stat = MS::kSuccess;
  254.  
  255.     DXCC_DPF_REPORT(TEXT("REFRESH SCENE"));
  256.     MGlobal::displayInfo("DirectX Rebuilding Scene");
  257.  
  258.     g_PreviewPipeline.Scene_Deregister();
  259.     g_PreviewPipeline.Scene_Register();
  260.  
  261.  
  262.  
  263.     return stat;
  264. }
  265.  
  266. MStatus DCCUnifiedViewerCommand ( const MArgList& Arg, const char* strView)
  267. {
  268.     //HRESULT hr= S_OK;
  269.     HWND renderwnd= NULL;
  270.     MDagPath MayaCamera;
  271.  
  272.  
  273.     if(strView && (strView[0] != '\0'))
  274.     {
  275.         M3dView ourView;
  276.         M3dView::get3dView(0,ourView);
  277.  
  278.         for(UINT iView= 0; iView < M3dView::numberOf3dViews(); iView++)
  279.         {
  280.             M3dView::get3dView(iView, ourView);
  281.             ourView.getCamera(MayaCamera);
  282.             MayaCamera.pop();
  283.             if(MayaCamera.partialPathName() == MString(strView))
  284.             {
  285.                 break;
  286.             }
  287.         }
  288.  
  289.         renderwnd= (HWND)ourView.window();
  290.     }
  291.  
  292.     g_PreviewPipeline.g_Viewer.BindToWindow(renderwnd); 
  293.  
  294. //e_Exit:
  295.  
  296.     return MS::kSuccess;
  297. }
  298.  
  299. MStatus DXCCGatherAnimationCommand::doIt ( const MArgList& Arg )
  300. {
  301.     MStatus stat= MS::kSuccess;
  302.  
  303.     DXCC_ASSERT_EXCEPTIONS_BEGIN()
  304.  
  305.  
  306.     g_PreviewPipeline.Scene_Update_Animation();
  307.  
  308.     DXCC_ASSERT_EXCEPTIONS_END()
  309.  
  310.     return stat;
  311. }
  312.  
  313.  
  314. MStatus DXCCPreviewToggleCommand::doIt ( const MArgList& Arg )
  315. {
  316.     MStatus stat= MS::kSuccess;
  317.  
  318.     DXCC_ASSERT_EXCEPTIONS_BEGIN()
  319.  
  320.  
  321.     if(1 <= Arg.length())
  322.     {
  323.         bool bPreview= Arg.asBool(0);
  324.         g_PreviewPipeline.UI_SetPreviewState(bPreview);
  325.     }
  326.  
  327.     DXCC_ASSERT_EXCEPTIONS_END()
  328.  
  329.     return stat;
  330. }
  331.  
  332. MStatus DXCCExportSelectedCommand::doIt ( const MArgList& Arg)
  333. {
  334.     HRESULT hr= S_OK;
  335.     OPENFILENAMEA open;
  336.     ZeroMemory(&open, sizeof(open));
  337.     char szFilename[MAX_PATH]= "";
  338.     open.lStructSize= sizeof(OPENFILENAME); 
  339.     open.hwndOwner= (HWND)M3dView::applicationShell();
  340.     open.hInstance= (HINSTANCE)GetWindowInstance(open.hwndOwner); 
  341.     open.lpstrFilter= "X-File\0*.x\0"; 
  342.     open.lpstrFile= szFilename;
  343.     open.nMaxFile= sizeof(szFilename);
  344.  
  345.  
  346.  
  347.     if(GetSaveFileNameA(&open))
  348.     {
  349.         char* pExtension= strrchr(szFilename, '.');
  350.         if(!pExtension || (0 != _stricoll(".x", pExtension)))
  351.         {
  352.             strcat(szFilename, ".x");
  353.         };
  354.  
  355.         hr= g_PreviewPipeline.Scene_Export(szFilename, NULL, MPxFileTranslator::FileAccessMode::kSaveAccessMode);
  356.     }
  357.  
  358.     return MS::kSuccess;}
  359.  
  360. MStatus DXCCExportSceneCommand::doIt ( const MArgList& Arg)
  361. {
  362.  
  363.     HRESULT hr= S_OK;
  364.     OPENFILENAMEA open;
  365.     ZeroMemory(&open, sizeof(open));
  366.     char szFilename[MAX_PATH]= "";
  367.     open.lStructSize= sizeof(OPENFILENAME); 
  368.     open.hwndOwner= (HWND)M3dView::applicationShell();
  369.     open.hInstance= (HINSTANCE)GetWindowInstance(open.hwndOwner); 
  370.     open.lpstrFilter= "X-File\0*.x\0"; 
  371.     open.lpstrFile= szFilename;
  372.     open.nMaxFile= sizeof(szFilename);
  373.  
  374.  
  375.  
  376.     if(GetSaveFileNameA(&open))
  377.     {
  378.         char* pExtension= strrchr(szFilename, '.');
  379.         if(!pExtension || (0 != _stricoll(".x", pExtension)))
  380.         {
  381.             strcat(szFilename, ".x");
  382.         };
  383.  
  384.         hr= g_PreviewPipeline.Scene_Export(szFilename, NULL, MPxFileTranslator::FileAccessMode::kSaveAccessMode);
  385.     }
  386.  
  387.     return MS::kSuccess;
  388. }
  389.  
  390. MStatus DXCCFrontViewCommand::doIt ( const MArgList& Arg)
  391. {
  392.     MStatus stat;
  393.     stat= DCCUnifiedViewerCommand(Arg, "front");
  394.     return stat;
  395. }
  396.  
  397. MStatus DXCCSideViewCommand::doIt ( const MArgList& Arg)
  398. {
  399.     MStatus stat;
  400.     stat= DCCUnifiedViewerCommand(Arg, "side");
  401.     return stat;
  402. }
  403.  
  404. MStatus DXCCTopViewCommand::doIt ( const MArgList& Arg)
  405. {
  406.     MStatus stat;
  407.     stat= DCCUnifiedViewerCommand(Arg, "top");
  408.     return stat;
  409. }
  410.  
  411. MStatus DXCCPerspectiveViewCommand::doIt ( const MArgList& Arg)
  412. {
  413.     MStatus stat;
  414.     stat= DCCUnifiedViewerCommand(Arg, "persp");
  415.     return stat;
  416. }
  417.  
  418. MStatus DXCCFloatingViewCommand::doIt ( const MArgList& Arg)
  419. {
  420.     MStatus stat;
  421.     stat= DCCUnifiedViewerCommand(Arg, NULL);
  422.     return stat;
  423. }
  424.  
  425. XFileTranslator::~XFileTranslator()
  426. {
  427.     return;
  428. };    
  429.  
  430. //-----------------------------------------------------------------------------
  431. // Name: initializePlugin()
  432. // Desc: Initializes the Maya XFile Exporter plugin
  433. //-----------------------------------------------------------------------------
  434.  
  435. MStatus    
  436. initializePlugin(MObject obj)
  437. {
  438.  
  439.  
  440.     MStatus stat = MS::kSuccess;
  441.  
  442.     DXCC_ASSERT_EXCEPTIONS_BEGIN()
  443.  
  444.  
  445.     TCHAR szPlugin[MAX_PATH];
  446.     TCHAR PluginFilePath[MAX_PATH];
  447.     TCHAR* PluginFileName= NULL;
  448.  
  449.     HMODULE hPluginModule= GetModuleHandle(TEXT(THISFILENAME));
  450.     DWORD OldLength= GetEnvironmentVariable(TEXT("PATH"),NULL,0);
  451.     DWORD ExtLength= GetModuleFileName(hPluginModule, szPlugin, MAX_PATH);
  452.     GetFullPathName(szPlugin, MAX_PATH, PluginFilePath, &PluginFileName);
  453.     PluginFileName[0]= TEXT('\0');
  454.     ExtLength= _tcslen(PluginFilePath)+1;
  455.  
  456.     DWORD NewLength= OldLength + ExtLength + 2;
  457.     LPTSTR szPath= (LPTSTR)_alloca( sizeof(TCHAR) * NewLength );
  458.  
  459.     if(NewLength > GetEnvironmentVariable(TEXT("PATH") , szPath , NewLength))
  460.     {
  461.         if(szPath[OldLength-2] != TEXT(';'))
  462.         {
  463.             szPath[OldLength-1]= TEXT(';');
  464.             szPath[OldLength]= TEXT('\0');
  465.             OldLength++;
  466.         }
  467.  
  468.         if(_tcsncpy( szPath+OldLength-1, PluginFilePath, ExtLength ))
  469.         {
  470.             szPath[OldLength+ExtLength-1]= TEXT(';');
  471.             szPath[OldLength+ExtLength]= TEXT('\0');
  472.         }
  473.  
  474.  
  475.            SetEnvironmentVariable(TEXT("PATH"), szPath);
  476.     }
  477.  
  478.  
  479.  
  480.  
  481.     MFnPlugin plugin(obj, "Microsoft", "5.0", "Any");
  482.     const MString DirectXShader_UserClassify( "shader/surface" );
  483.     MArgList args;
  484.  
  485. #ifdef _DEBUG
  486.     MGlobal::startErrorLogging("c:\\D3DMayaExportXErrorLog.txt");
  487. #endif
  488.  
  489.     g_PreviewPipeline.CallbackId_Exiting= MSceneMessage::addCallback( MSceneMessage::Message::kMayaExiting, CMayaPreviewPipeline::Callback_MayaExiting, NULL, NULL);
  490.     
  491.     //Menu Creation
  492.     MGlobal::executeCommand("source DirectX", true, true);
  493.  
  494.  
  495.  
  496.     g_PreviewPipeline.Create();
  497.  
  498.     stat= plugin.registerNode( 
  499.         DXCC_SHADER, 
  500.         DirectXShader::id, 
  501.         DirectXShader::creator, 
  502.         DirectXShader::initialize, 
  503.         MPxNode::kDependNode, 
  504.         &DirectXShader_UserClassify );
  505.     CHECK_MSTATUS(stat);
  506.  
  507.     // register the translator
  508.     stat = plugin.registerFileTranslator(DXCC_EXPORTER,            // name
  509.                                          NULL,        // icon
  510.                                          XFileTranslator::creator,    
  511.                                          NULL,        // script
  512.                                          NULL,
  513.                                          false);
  514.     CHECK_MSTATUS(stat);
  515.  
  516.     CHECK_MSTATUS(stat= plugin.registerCommand( DXCC_PREVIEW_TOGGLE ,  DXCCPreviewToggleCommand::creator ));
  517.     CHECK_MSTATUS(stat= plugin.registerCommand( DXCC_GATHER_ANIMATION,  DXCCGatherAnimationCommand::creator ));
  518.     CHECK_MSTATUS(stat= plugin.registerCommand( DXCC_REBUILD_SCENE,  DXCCRebuildSceneCommand::creator ));
  519.     CHECK_MSTATUS(stat= plugin.registerCommand( DXCC_REBUILD_SELECTED,  DCCRebuildSelectedCommand::creator ));
  520.     CHECK_MSTATUS(stat= plugin.registerCommand( DXCC_EXPORT_SCENE,  DXCCExportSceneCommand::creator ));
  521.     CHECK_MSTATUS(stat= plugin.registerCommand( DXCC_EXPORT_SELECTED,  DXCCExportSelectedCommand::creator ));
  522.     CHECK_MSTATUS(stat= plugin.registerCommand( DXCC_VIEW_FLOATING,  DXCCFloatingViewCommand::creator ));
  523.     CHECK_MSTATUS(stat= plugin.registerCommand( DXCC_VIEW_FRONT,  DXCCFrontViewCommand::creator ));
  524.     CHECK_MSTATUS(stat= plugin.registerCommand( DXCC_VIEW_SIDE,  DXCCSideViewCommand::creator ));
  525.     CHECK_MSTATUS(stat= plugin.registerCommand( DXCC_VIEW_TOP,  DXCCTopViewCommand::creator ));
  526.     CHECK_MSTATUS(stat= plugin.registerCommand( DXCC_VIEW_PERSP,  DXCCPerspectiveViewCommand::creator ));
  527.  
  528.  
  529.     //Scene Registration ... 
  530.     g_PreviewPipeline.Scene_Register();
  531.  
  532.     D3DPRESENT_PARAMETERS pp = {0};
  533.     pp.BackBufferWidth = 640;
  534.     pp.BackBufferHeight = 480;
  535.     pp.BackBufferCount = 1;
  536.     pp.MultiSampleType = D3DMULTISAMPLE_NONE;
  537.     pp.MultiSampleQuality = 0;
  538.     pp.SwapEffect = D3DSWAPEFFECT_DISCARD;
  539.     pp.hDeviceWindow = NULL;
  540.     pp.Windowed = true;
  541.     pp.EnableAutoDepthStencil = true;
  542.     pp.AutoDepthStencilFormat = D3DFMT_D16;
  543.     pp.FullScreen_RefreshRateInHz = 0;
  544.     pp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;
  545.  
  546.     g_PreviewPipeline.g_Viewer.Create( &g_PreviewPipeline, &pp );
  547.     
  548.     DXCC_ASSERT_EXCEPTIONS_END()
  549.  
  550.     return stat;
  551. };
  552.  
  553.  
  554. //-----------------------------------------------------------------------------
  555. // Name: uninitializePlugin()
  556. // Desc: Uninitializes the Maya XFile Exporter plugin
  557. //-----------------------------------------------------------------------------
  558.  
  559.  
  560. MStatus    
  561. uninitializePlugin(MObject obj) 
  562. {
  563.     MStatus stat = MS::kSuccess;
  564.     try
  565.     {
  566.         MFnPlugin plugin(obj);
  567.  
  568.         CMayaPreviewPipeline::Callback_MayaExiting(NULL);
  569.  
  570.         stat = plugin.deregisterNode( DirectXShader::id );
  571.         stat = plugin.deregisterFileTranslator(DXCC_EXPORTER);
  572.         stat = plugin.deregisterCommand(DXCC_PREVIEW_TOGGLE);
  573.         stat = plugin.deregisterCommand(DXCC_GATHER_ANIMATION);
  574.         stat = plugin.deregisterCommand(DXCC_REBUILD_SCENE);
  575.         stat = plugin.deregisterCommand(DXCC_REBUILD_SELECTED);
  576.         stat = plugin.deregisterCommand(DXCC_EXPORT_SCENE);
  577.         stat = plugin.deregisterCommand(DXCC_EXPORT_SELECTED);
  578.         stat = plugin.deregisterCommand(DXCC_VIEW_FLOATING);
  579.         stat = plugin.deregisterCommand(DXCC_VIEW_TOP);
  580.         stat = plugin.deregisterCommand(DXCC_VIEW_SIDE);
  581.         stat = plugin.deregisterCommand(DXCC_VIEW_FRONT);
  582.         stat = plugin.deregisterCommand(DXCC_VIEW_PERSP);
  583.     
  584.         MGlobal::executeCommand("DirectX_RemoveMenu()");
  585.  
  586.     }
  587.     catch( ... )
  588.     {
  589.     }
  590.  
  591.     return stat;
  592. }
  593.  
  594.  
  595. void CMayaPreviewPipeline::Callback_MayaExiting( void* clientData )
  596. {
  597.         CPipelineLock Lock;
  598.  
  599.         //if we get this lock then we are ready to end because we 
  600.         g_PreviewPipeline.SceneWriteLock(true, Lock); 
  601.         
  602.         g_PreviewPipeline.g_Viewer.Destroy();
  603.  
  604.         g_PreviewPipeline.Destroy();
  605.     
  606.         g_PreviewPipeline.SceneWriteUnlock(Lock); 
  607.  
  608.  
  609.     return;
  610. }
  611.  
  612.  
  613. //-----------------------------------------------------------------------------
  614. // XFILETRANSLATOR MEMBER FUNCTIONS
  615. //-----------------------------------------------------------------------------
  616.  void*        XFileTranslator::creator()                    
  617.     return new XFileTranslator(); 
  618. };
  619.  
  620. MStatus        XFileTranslator::reader(const MFileObject& file, const MString& optionsString, MPxFileTranslator::FileAccessMode mode) 
  621.     return MS::kSuccess; 
  622. };
  623.  
  624. bool        XFileTranslator::haveReadMethod() const        
  625.     return false; 
  626. };
  627.  
  628. bool        XFileTranslator::haveWriteMethod() const        
  629.     return true; 
  630. };
  631.  
  632. MString     XFileTranslator::defaultExtension() const    
  633.     return "x"; 
  634. }
  635.  
  636. MString     XFileTranslator::filter() const                
  637.     return "*.x"; 
  638. }
  639.  
  640. MPxFileTranslator::MFileKind 
  641. XFileTranslator::identifyFile(    
  642.     const MFileObject& fileName,
  643.     const char* buffer,
  644.     short size) const
  645.     char *extension= strchr(fileName.name().asChar(), '.');
  646.     if(0==_stricoll(".x", extension))
  647.     {
  648.         return MFileKind::kIsMyFileType;
  649.     }
  650.     else
  651.     {
  652.         return MFileKind::kNotMyFileType; 
  653.     }
  654. }
  655.  
  656. MStatus    
  657. XFileTranslator::writer(
  658.             const MFileObject& mfoXFile,            // save file object
  659.             const MString& msOptions,                // options string
  660.             MPxFileTranslator::FileAccessMode mode)    // options string
  661. {
  662.     HRESULT hr = S_OK;
  663.     MStatus stat = MS::kSuccess;
  664.  
  665.     MString    msFile= mfoXFile.fullName();
  666.     char* pExtension= strrchr(msFile.asChar(), '.');
  667.     if(!pExtension || (0 != _stricoll(".x", pExtension)))
  668.     {
  669.         msFile += ".x";
  670.     };
  671.  
  672.     hr= g_PreviewPipeline.Scene_Export(msFile.asChar(), msOptions.asChar(), mode);
  673.     if(FAILED(hr))
  674.     {
  675.         stat= MS::kFailure;
  676.         goto e_Exit;
  677.     };
  678.  
  679. e_Exit:
  680.     return stat;
  681. }
  682.  
  683.  
  684. void* DirectXShader::creator()
  685. {
  686.     return new DirectXShader();
  687. }
  688.  
  689.  
  690. // The initialize method is called only once when the node is first
  691. // registered with Maya. In this method you define the attributes of the
  692. // node, what data comes in and goes out of the node that other nodes may
  693. // want to connect to. 
  694. //
  695.  
  696. MStatus DirectXShader::initialize()
  697. {
  698.     MFnNumericAttribute nAttr; 
  699.     MFnTypedAttribute tAttr; 
  700.  
  701.     MStatus status; 
  702.  
  703.     if(DirectXShader::FxDialogEvent == NULL)
  704.     {
  705.         DirectXShader::FxDialogEvent= CreateEventA(NULL, TRUE, TRUE, "FxDialogEvent");
  706.         SetEvent(DirectXShader::FxDialogEvent);
  707.     }
  708.  
  709.  
  710.     // Input Attributes
  711.     aColorR = nAttr.create( "colorR", "cr",MFnNumericData::kFloat, 0, &status );
  712.     CHECK_MSTATUS( status );
  713.     CHECK_MSTATUS( nAttr.setKeyable( true ) );
  714.     CHECK_MSTATUS( nAttr.setStorable( true ) );
  715.     CHECK_MSTATUS( nAttr.setDefault( 0.0f ) );
  716.  
  717.     aColorG = nAttr.create( "colorG", "cg", MFnNumericData::kFloat, 0, &status );
  718.     CHECK_MSTATUS( status );
  719.     CHECK_MSTATUS( nAttr.setKeyable( true ) );
  720.     CHECK_MSTATUS( nAttr.setStorable( true ) );
  721.     CHECK_MSTATUS( nAttr.setDefault( 0.58824f ) );
  722.  
  723.     aColorB = nAttr.create( "colorB", "cb",MFnNumericData::kFloat, 0, &status );
  724.     CHECK_MSTATUS( status );
  725.     CHECK_MSTATUS( nAttr.setKeyable( true ) );
  726.     CHECK_MSTATUS( nAttr.setStorable( true ) );
  727.     CHECK_MSTATUS( nAttr.setDefault( 0.644f ) );
  728.  
  729.     aColor = nAttr.create( "color", "c", aColorR, aColorG, aColorB, &status );
  730.     CHECK_MSTATUS( status );
  731.     CHECK_MSTATUS( nAttr.setKeyable( true ) );
  732.     CHECK_MSTATUS( nAttr.setStorable( true ) );
  733.     CHECK_MSTATUS( nAttr.setDefault( 0.0f, 0.58824f, 0.644f ) );
  734.     CHECK_MSTATUS( nAttr.setUsedAsColor( true ) );
  735.  
  736.     aDXCCCommand = tAttr.create( "Command", "DXC",  MFnData::kString,  MObject::kNullObj , &status );
  737.     CHECK_MSTATUS( status );
  738.     CHECK_MSTATUS( tAttr.setKeyable( false ) );
  739.     CHECK_MSTATUS( tAttr.setStorable( false ) );
  740.     CHECK_MSTATUS( tAttr.setInternal( true ) );
  741. #ifndef _DEBUG
  742.     CHECK_MSTATUS( nAttr.setHidden( true ) );
  743. #endif
  744.  
  745.     aDXCCHandle = nAttr.create( DX_LONG_FXHANDLE, DX_SHORT_FXHANDLE, MFnNumericData::kInt, 0, &status );
  746.     CHECK_MSTATUS( status );
  747.     CHECK_MSTATUS( nAttr.setKeyable( false ) );
  748.     CHECK_MSTATUS( nAttr.setStorable( false ) );
  749.     CHECK_MSTATUS( nAttr.setInternal( false ) );
  750.     CHECK_MSTATUS( nAttr.setHidden( true ) );
  751.  
  752.     // Color Output
  753.     aOutColorR = nAttr.create( "outColorR", "ocr", MFnNumericData::kFloat, 0, &status );
  754.     CHECK_MSTATUS( status );
  755.     
  756.     aOutColorG = nAttr.create( "outColorG", "ocg", MFnNumericData::kFloat, 0, &status );
  757.     CHECK_MSTATUS( status );
  758.     
  759.     aOutColorB = nAttr.create( "outColorB", "ocb", MFnNumericData::kFloat, 0, &status );
  760.     CHECK_MSTATUS( status );
  761.     
  762.     aOutColor = nAttr.create( "outColor", "oc", aOutColorR, aOutColorG, aOutColorB, &status );
  763.     CHECK_MSTATUS( status );
  764.     
  765.     CHECK_MSTATUS( nAttr.setHidden( false ) );
  766.     CHECK_MSTATUS( nAttr.setReadable( true ) );
  767.     CHECK_MSTATUS( nAttr.setWritable( false ) );
  768.  
  769.     // Camera Normals
  770.     aNormalCameraX = nAttr.create( "normalCameraX", "nx", MFnNumericData::kFloat, 0, &status );
  771.     CHECK_MSTATUS( status );
  772.     CHECK_MSTATUS( nAttr.setStorable( false ) );
  773.     CHECK_MSTATUS( nAttr.setDefault( 1.0f ) );
  774.  
  775.     aNormalCameraY = nAttr.create( "normalCameraY", "ny", MFnNumericData::kFloat, 0, &status );
  776.     CHECK_MSTATUS( status );
  777.     CHECK_MSTATUS( nAttr.setStorable( false ) );
  778.     CHECK_MSTATUS( nAttr.setDefault( 1.0f ) );
  779.  
  780.     aNormalCameraZ = nAttr.create( "normalCameraZ", "nz", MFnNumericData::kFloat, 0, &status );
  781.     CHECK_MSTATUS( status );
  782.     CHECK_MSTATUS( nAttr.setStorable( false ) );
  783.     CHECK_MSTATUS( nAttr.setDefault( 1.0f ) );
  784.  
  785.     aNormalCamera = nAttr.create( "normalCamera","n", aNormalCameraX, aNormalCameraY, aNormalCameraZ, &status );
  786.     CHECK_MSTATUS( status );
  787.     CHECK_MSTATUS( nAttr.setStorable( false ) );
  788.     CHECK_MSTATUS( nAttr.setDefault( 1.0f, 1.0f, 1.0f ) );
  789.     CHECK_MSTATUS( nAttr.setHidden( true ) );
  790.  
  791.  
  792.     // Next we will add the attributes we have defined to the node
  793.     CHECK_MSTATUS( addAttribute( aDXCCCommand ) );
  794.     CHECK_MSTATUS( addAttribute( aDXCCHandle ) );
  795.     CHECK_MSTATUS( addAttribute( aColor ) );
  796.     CHECK_MSTATUS( addAttribute( aOutColor ) );
  797.     CHECK_MSTATUS( addAttribute( aNormalCamera ) );
  798.  
  799.     CHECK_MSTATUS( attributeAffects( aColorR, aOutColor ) );
  800.     CHECK_MSTATUS( attributeAffects( aColorG, aOutColor ) );
  801.     CHECK_MSTATUS( attributeAffects( aColorB, aOutColor ) );
  802.     CHECK_MSTATUS( attributeAffects( aColor, aOutColor ) );
  803.     CHECK_MSTATUS( attributeAffects( aNormalCameraX, aOutColor ) );
  804.     CHECK_MSTATUS( attributeAffects( aNormalCameraY, aOutColor ) );
  805.     CHECK_MSTATUS( attributeAffects( aNormalCameraZ, aOutColor ) );
  806.     CHECK_MSTATUS( attributeAffects( aNormalCamera, aOutColor ) );
  807.  
  808.     return( MS::kSuccess );
  809. }
  810.  
  811. void DirectXShader::postConstructor( )
  812. {
  813.     HRESULT hr= S_OK; 
  814.     MStatus status= MStatus::kSuccess; 
  815.     int iHandle= 0;
  816.     DXCCHANDLE hHandle= NULL;
  817.  
  818.     LPDXCCRESOURCE pResource= NULL;
  819.  
  820.     setMPSafe( true );
  821.  
  822.     MObject object= thisMObject();
  823.     MPlug plug(object, aDXCCHandle);
  824.  
  825.     hr= g_PreviewPipeline.AccessManager()->CreateResource(NULL, IID_NULL, false, &pResource);
  826.     if(DXCC_FAILED(hr))
  827.         DXCC_GOTO_EXIT(e_Exit, TRUE);
  828.  
  829.     g_PreviewPipeline.TriggerManagerEvents.OnResourceAdd(pResource);
  830.  
  831.     CHECK_MSTATUS( plug.setValue((INT)pResource->GetHandle()) );
  832.  
  833. e_Exit:
  834.     DXCC_RELEASE(pResource);
  835.  
  836.     return;
  837. }
  838.  
  839. bool DirectXShader::setInternalValue( const MPlug& plug, const MDataHandle& dataIn)
  840. {
  841.     HRESULT hr= S_OK;
  842.     MStatus status= MStatus::kSuccess; 
  843.  
  844.     if((plug == aDXCCCommand) && GetSingleObject(false, DirectXShader::FxDialogEvent))
  845.     {
  846.         ResetEvent(DirectXShader::FxDialogEvent);
  847.  
  848.         //BOOL bModal;
  849.         int iHandle;
  850.         DXCCHANDLE hHandle;
  851.         LPDIRECT3DDEVICE9 pDevice= NULL;
  852.         LPDXCCRESOURCE pResource= NULL;
  853.         MString& mayaCommand= dataIn.asString();
  854.         const char* strCommand= mayaCommand.asChar();
  855.  
  856.         MPlug plugMaterial(plug.node(), aDXCCHandle);
  857.         plugMaterial.getValue(iHandle);
  858.         hHandle= (DXCCHANDLE)iHandle;
  859.  
  860.         hr= g_PreviewPipeline.AccessManager()->FindResourceByHandle(hHandle, &pResource);
  861.         if(DXCC_FAILED(hr))
  862.             DXCC_GOTO_EXIT(e_Exit, TRUE);
  863.  
  864.  
  865.         if(0==lstrcmpiA(strCommand, "open"))
  866.         {
  867.  
  868.             hr= g_PreviewPipeline.AccessEngine()->GetD3DDevice(&pDevice);
  869.             if(DXCC_FAILED(hr))
  870.                 DXCC_GOTO_EXIT(e_Exit, TRUE);
  871.     
  872.  
  873.             hr= DXCCShowEffectDialog(
  874.                     (HWND)M3dView::applicationShell(),
  875.                     pDevice,
  876.                     g_PreviewPipeline.AccessManager(),
  877.                     pResource,
  878.                     this, 
  879.                     TRUE,
  880.                     FALSE);
  881.             if(DXCC_FAILED(hr))
  882.             {
  883.                 SetEvent(DirectXShader::FxDialogEvent);
  884.                 DXCC_GOTO_EXIT(e_Exit, TRUE);
  885.             }
  886.         }
  887.         else
  888.         {
  889.             SetEvent(DirectXShader::FxDialogEvent);
  890.         }
  891.  
  892. e_Exit:
  893.         DXCC_RELEASE(pDevice);
  894.         DXCC_RELEASE(pResource);
  895.  
  896.  
  897.         return TRUE;
  898.     }
  899.     else
  900.     {
  901.         return MPxNode::setInternalValue(plug, dataIn);
  902.     }
  903. }
  904.  
  905.  
  906. HRESULT DirectXShader::OnPostLoad( 
  907.     HWND hDialog, 
  908.     LPDIRECT3DDEVICE9 pDevice,
  909.     LPDXCCMANAGER pManager,
  910.     LPDXCCRESOURCE pResource,//recycle me
  911.     LPCSTR szNewEffectFilename) 
  912. {
  913.     CPipelineLock SceneLock;
  914.  
  915.     g_PreviewPipeline.SceneReadLock(true, SceneLock);
  916.  
  917.     bool FoundInDirtyBin= false;
  918.     for(UINT i = 0; i < g_PreviewPipeline.DirtyShaders.size(); i++)
  919.     {
  920.         if(g_PreviewPipeline.DirtyShaders[i]==pResource->GetHandle())
  921.         {
  922.             FoundInDirtyBin=true;
  923.             break;
  924.         }
  925.     }
  926.     if(!FoundInDirtyBin)
  927.     {
  928.         g_PreviewPipeline.DirtyShaders.push_back(pResource->GetHandle());
  929.     }
  930.  
  931.     g_PreviewPipeline.SceneReadUnlock(SceneLock);
  932.  
  933.     return S_OK;
  934. }
  935.  
  936. HRESULT DirectXShader::OnClose(  
  937.     HWND hDialog, 
  938.      LPDIRECT3DDEVICE9 pDevice,
  939.      LPDXCCMANAGER pManager,
  940.      LPDXCCRESOURCE pResource)
  941. {
  942.     SetEvent(DirectXShader::FxDialogEvent);
  943.  
  944.     return S_OK; 
  945. }
  946.  
  947. MStatus DirectXShader::compute( const MPlug& plug, MDataBlock& block ) 
  948.     // The plug parameter will allow us to determine which output attribute
  949.     // needs to be calculated.
  950.     //
  951.     if( plug == aOutColor
  952.             || plug == aOutColorR
  953.             || plug == aOutColorG
  954.             || plug == aOutColorB)
  955.     {
  956.         MStatus status= MS::kSuccess;
  957.         MFloatVector resultColor( 0.0, 0.0, 0.0 ); 
  958.  
  959.     
  960.         // Get surface shading parameters from input block
  961.         //
  962.         MFloatVector& surfaceNormal = block.inputValue( aNormalCamera,
  963.                 &status ).asFloatVector();
  964.         CHECK_MSTATUS( status );
  965.  
  966.         MFloatVector& surfaceColor = block.inputValue( aColor,
  967.                 &status ).asFloatVector();
  968.         CHECK_MSTATUS( status );
  969.  
  970.         // Factor incident light with surface color and add incandescence
  971.         //
  972.  
  973.         float dot= -surfaceNormal[1];
  974.         if(dot < 0) dot = 0;
  975.         resultColor[0] = dot * surfaceColor[0];
  976.         resultColor[1] = dot * surfaceColor[1];
  977.         resultColor[2] = dot * surfaceColor[2];
  978.  
  979.  
  980.         if ( plug == aOutColor || plug == aOutColorR || plug == aOutColorG
  981.                 || plug == aOutColorB)
  982.         {
  983.             // Get the handle to the attribute
  984.             //
  985.             MDataHandle outColorHandle = block.outputValue( aOutColor,
  986.                     &status );
  987.             CHECK_MSTATUS( status );
  988.             MFloatVector& outColor = outColorHandle.asFloatVector();
  989.         
  990.             outColor = resultColor;        // Set the output value
  991.             outColorHandle.setClean(); // Mark the output value as EraseInvalidTags
  992.         }
  993.     } 
  994.     else
  995.     {
  996.         return( MS::kUnknownParameter ); // We got an unexpected plug
  997.     }
  998.  
  999.     return( MS::kSuccess );
  1000. }
  1001.  
  1002.  
  1003.  
  1004.  
  1005.